class SocketService {
  // 单例设计模式
  static instance = null;
  static get Instance() {
    if (!this.instance) {
      this.instance = new SocketService();
    }
    return this.instance;
  }
  // 和服务器连接的socket对象
  ws = null;
  // 存储回调函数
  callBackMapping = {};
  // 连接状态标识
  connected = false;
  // 重新发送次数
  sendRecord = 0;
  // 重新连接次数
  connectRecord = 0;
  // 定时器
  sendTimer = null;
  connectTimer = null;

  // 连接服务器的方法
  connect() {
    if (!window.WebSocket) {
      return console.log("您的浏览器不支持WebSocket");
    }
    this.ws = new WebSocket("ws://127.0.0.1:9998");
    // 连接成功
    this.ws.onopen = () => {
      console.log("连接服务端成功");
      this.connected = true;
      this.connectRecord = 0;
    };
    // 连接失败
    this.ws.onclose = () => {
      console.log("连接服务端失败");
      this.connected = false;
      // 如果连接不成功，重新连接
      // 重试的次数越多，重新连接的时间越大，避免浪费资源，因为服务器可能关机了
      this.connectRecord++;
      if (this.connectTimer) clearTimeout(this.connectTimer);
      if (this.connectRecord * 500 >= Number.MAX_SAFE_INTEGER) {
        this.connectRecord = 0;
        return;
      }
      this.connectTimer = setTimeout(() => {
        this.connect();
      }, this.connectRecord * 500);
    };
    // 得到服务端传过来的数据
    this.ws.onmessage = msg => {
      console.log("从服务端获取到了数据");
      // 真正从服务器发送过来的数据在msg中的data字段
      // console.log(msg.data)
      const receive = JSON.parse(msg.data);
      const socketType = receive.socketType;
      if (this.callBackMapping[socketType]) {
        const action = receive.action;
        if (action === "getData") {
          const realData = JSON.parse(receive.data);
          this.callBackMapping[socketType].call(this, realData);
        } else if (action === "fullScreen") {
          this.callBackMapping[socketType].call(this, receive);
        } else if (action === "themeChange") {
          this.callBackMapping[socketType].call(this);
        }
      }
    };
  }

  // 注册回调函数
  registerCallback(socketType, callback) {
    this.callBackMapping[socketType] = callback;
  }
  // 注销回调函数
  unRegisterCallback(socketType) {
    this.callBackMapping[socketType] = null;
  }
  // 发送数据
  send(data) {
    if (this.connected) {
      this.sendRecord = 0;
      this.ws.send(JSON.stringify(data));
    } else {
      // 如果发送不成功，重新发送
      // 重试的次数越多，重新发送的时间越大，避免浪费资源，因为服务器可能关机了
      this.sendRecord++;
      if (this.sendTimer) clearTimeout(this.sendTimer);
      if (this.sendRecord * 500 >= Number.MAX_SAFE_INTEGER) {
        this.sendRecord = 0;
        return;
      }
      this.sendTimer = setTimeout(() => {
        this.send(data);
      }, this.sendRecord * 500);
    }
  }
}
export default SocketService;
